package org.wdcode.core.lucene.index;

import java.util.List;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.wdcode.common.exception.CustomRuntimeException;
import org.wdcode.common.util.CommonUtil;
import org.wdcode.core.lucene.field.LuceneField;
import org.wdcode.core.lucene.need.LuceneNeed;

/**
 * Lucene索引器实现
 * @author WD
 * @since JDK6
 * @version 1.0 2010-05-25
 */
final class LuceneIndexImpl implements LuceneIndex {
	// Lucene 索引写入器
	private IndexWriter	writer;
	// Lucene 索引读取器
	private IndexReader	reader;
	// 封装的Lucene使用的类
	private LuceneNeed	need;

	/**
	 * 构造参数
	 * @param indexPath 索引目录
	 */
	public LuceneIndexImpl(LuceneNeed luceneNeed) {
		// 获得需求类接口
		need = luceneNeed;
		// 实例化Lucene 索引写入器
		try {
			// 获得索引写入器
			writer = new IndexWriter(need.getDirectory(), need.getAnalyzer(), need.isCreate(), need.getMaxFieldLength());
			// 获得索引读取器
			reader = IndexReader.open(need.getDirectory(), need.isReadOnly());
		} catch (Exception e) {
			throw new CustomRuntimeException(e);
		}
	}

	/**
	 * 添加索引
	 * @param fields 添加的字段
	 * @return Document 文档对象
	 */
	public final void add(List<LuceneField> fields) {
		add(new Document(), fields.toArray(new LuceneField[0]));
	}

	/**
	 * 添加索引
	 * @param fields 添加的字段
	 * @return Document 文档对象
	 */
	public final void add(LuceneField... fields) {
		add(new Document(), fields);
	}

	/**
	 * 获得Lucene 索引写入器
	 * @return Lucene 索引写入器
	 */
	public final IndexWriter getIndexWriter() {
		return writer;
	}

	/**
	 * 获得Lucene 索引读取器
	 * @return Lucene 索引读取器
	 */
	public final IndexReader getIndexReader() {
		return reader;
	}

	/**
	 * 获得Lucene使用的类包
	 * @return Lucene使用的类包
	 */
	public final LuceneNeed getLuceneNeed() {
		return need;
	}

	/**
	 * 添加文档
	 * @param doc Lucene Document
	 */
	private void addDocument(Document doc) {
		try {
			writer.addDocument(doc);
		} catch (Exception e) {
			throw new CustomRuntimeException(e);
		}
	}

	/**
	 * 添加索引
	 * @param fields 添加的字段
	 * @param doc 文档对象
	 */
	private Document add(Document doc, LuceneField... fields) {
		// 判断Document是否为空
		if (CommonUtil.isEmpty(doc)) {
			doc = new Document();
		}
		// 判断fields不为空
		if (!CommonUtil.isEmpty(fields)) {
			// 循环fields
			for (int i = 0; i < fields.length; i++) {
				doc.add(fields[i].getField());
			}
		}
		// 添加到index
		addDocument(doc);
		// 返回文档对象
		return doc;
	}

	/**
	 * 添加索引
	 * @param fields 添加的字段
	 * @param doc 文档对象
	 */
	// private Document add(Document doc, List<LuceneField> fields) {
	// // 判断Document是否为空
	// if (CommonUtil.isEmpty(doc)) {
	// doc = new Document();
	// }
	// // 判断fields不为空
	// if (!CommonUtil.isEmpty(fields)) {
	// // 循环fields
	// for (int i = 0; i < fields.size(); i++) {
	// doc.add(fields.get(i).getField());
	// }
	// }
	// // 添加到index
	// addDocument(doc);
	// // 返回文档对象
	// return doc;
	// }
}
